package henry;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;

/**
 * @Author: hujian
 * @Date: 2020/9/16 18:24
 * @Description: jsoup左偏移
 */
public class JsoupOffset {

    public static void main(String[] args) {
        String reportHtml = "<p>实习报告,顾名思义,在实际中学习。在经历了一段时间的学习,或者当学习结束时,我们就需要知道自己的所学,或者应该如何运用实践。因为所有的知识都是从实践中得来的," +
                "归于实际。所以要用实践的方法来检查所学的知识。这时即将毕业,实习的重要性越来越大。<em class=\"similar\">这不长的实习时间让我明白了很多</em><em " +
                "class=\"similar\">,也学习到了很多。</em>辛苦的原因是刚踏上职位,有许多方面的不能迅速适应;而充实就是在此期间,我学会了在学校里没有涉及到的知识与技能,<em class=\"similar\">更提升了自己各方面的素质</em><em class=\"similar\">。同时</em><em class=\"similar\">,实习还给了我一些工作经验</em>。为将后的职业方向和发展奠定了基础现在把这些日子所学到的技能和知识和不足进行了一个小结。一是总结经验,二是对这些天的工作进行会议,并反省自己,在接下来的几天里,我们要经历一些事情。我所做的工作是在公司内部学习业务,在公司内部学习业务,在公司内部学习。平时协助公司工作人员,帮助公司工作人员做一些能力可及的工作,平时还可以跟公司的会计人员学习一些知识。打印一些东西,整理一些文件,检查某些文件中的错字问题,请求会计解决一些问题。在会议上,我可以记下一些重要的问题,并学到一些知识。我的虚心学习获得了公司认可,<em class=\"similar\">但我学到了的却是一年来我难以在大学里学到的</em><em class=\"similar\">。就像怎么与同事相处一样</em><em class=\"similar\">,相信人际关系是当今不少大学生踏出社会所遇到的大难题</em><em class=\"similar\">,于是我在实习中就有意观察他们是怎么与同事和上级交往的</em><em class=\"similar\">,而自己也尽可能地虚心求教</em><em class=\"similar\">,不耻地问</em>。<em class=\"similar\">要搞清楚人际关系</em>要搞好人际关系,<em class=\"similar\">不仅局限于部门</em><em class=\"similar\">,还要与其他部门</em><em class=\"similar\">,和所有的同事相处得好</em><em class=\"similar\">,这样工作效率就会更高</em>人们说的,只有团结才能成功,在我们日常的工作中,也是没有道理的。而且在工作中经常与前辈谈天,谈人生,不仅能放松神经,而且能学到许多工作之外的东西,前辈比我们多几十年的经验,她们的经验和方法都值得我们去学习,虽然很多情况我们都不必要遇到,但有所理解做到了心里有数,也算这次实习的目的。在实习期间发现的问题仍然很多,也与同事们讨论了,同事们只是劝我,这里已经步入了社会,是私营企业,公司也是这样,领导安排你什么工作你就做什么工作,剩下的抱怨没有什么用。在我看来,是提出意见,发表自己的见解,是反映场景,在他们来说是抱怨,在社会上很多事情没有人听我们的意见,不像在学校给我们如此大的发展空间,我的冲动,我的见解,我的意见,都不能得到他人的赏识,我的任何事情都要以自己的单纯客观眼光角度来看待评价,也许对这个充满物质的纷繁复杂社会并不那么容易适应,也许这一刻的种种小小棱角也或许会在自己经历了一年的岁月磨练之后,像一块鹅卵石一样光滑闪亮起来。<em class=\"similar\">在实习中</em><em class=\"similar\">,我认真苦练</em><em class=\"similar\">,吃苦</em><em class=\"similar\">,有上进心</em><em class=\"similar\">。为人诚恳</em><em class=\"similar\">,虚心善学</em><em class=\"similar\">,能正确地对待</em>处理人生和工作所遇到的种种困难,思想上进,理解潜在的,独立的潜力,有很强的队伍精神,有很强的群众荣誉感。做事严肃负责,有很强的责任心<em class=\"similar\">。有强烈的上进心</em><em class=\"similar\">,事业心</em><em class=\"similar\">,对环境有很大的适应能力</em><em class=\"similar\">,能够很快地融入到群众中</em><em class=\"similar\">。在工作上遇到的不懂之处</em><em class=\"similar\">,能虚心地向有经历的前辈求教</em><em class=\"similar\">,善于思考</em><em class=\"similar\">,能举一反三</em><em class=\"similar\">。对于他人提出的推荐</em><em class=\"similar\">,可以虚心观察</em><em class=\"similar\">。在时间紧张的情况下</em>加时加班完成了任务。能够灵活地运用学校学到的知识,将其应用于具体工作,保质量完成了工作的任务。同时,<em class=\"similar\">我严格遵循我公司各项规章制度</em>,在实习中,从未出现无故<em class=\"similar\">、迟到早退的现象</em>我踏实实地,努力到最大的努力,工作一直以\"热心、细心\"为指导。遇到不知道的问题,用心询问同事,在同事热心协助下,问题迅速解决<em class=\"similar\">,这是一段简短的实习生活</em><em class=\"similar\">,虽然很紧张</em><em class=\"similar\">,收获很多</em><em class=\"similar\">。但给我的只是初步经验的积累</em>对于以后走向社会的经验还是不足的。我在学校学不到很多知识,在学校里是学的,在学校中是学的,在社会中是如何使用知识的,毕业实践是每一个大学生都必须有的经历,它使我们从实践中学到社会,<em class=\"similar\">让我们学习到很多课堂上学不到的知识</em>,受益浅薄,也开阔了视野增加了见识,让我认识到,将来的知识传播给我。所学知识在工作上具体运用,为以后走向社会奠定坚实基础,只有在实践中尽快调整自我学习的方式,适应社会,才能为社会接纳,进而存在发展。刚进了单位时,我有一些担忧,经历了一系列的实践,我努力调整自己的观念,正确地认识到单位、个人和发展的方向,我相信,只要我们在现实中立足,改变和调整自己的角度,锐意进取,在成才之路上继续攀爬,有朝日,那些成才之机就会随之而来,促使我们成为一名成才,促使我们成为一名成才。是社会上公认的才华。实习的目标是了解企业管理先进的方式和现代的管理方式,提高了调查、<em class=\"similar\">文献检查和收集资料的能力</em><em class=\"similar\">,提高了理论和实际的结合性</em><em class=\"similar\">,提高了协同合作和组织工作本事</em><em class=\"similar\">,培养了独立分析问题</em><em class=\"similar\">,解决了实际问题的能力</em>要知道你是否能够胜任工作,关键是你自身对待工作的态度。态度是对的,即使是以前学过的专业知识,也可以逐渐在工作中掌握。态度差,即使自己有了基础,也不能把工作做得很好。在心理努力适应整个环境时,<em class=\"similar\">体会的莫过是实际的工作收获</em><em class=\"similar\">。尤其是在实践过程中</em><em class=\"similar\">,我亲眼目睹了工人的师傅对工作的认真负责</em><em class=\"similar\">,精益求精</em><em class=\"similar\">,无私奉献的作风</em>在实践过程中,我感觉到最深刻、受益的是这一工作风格,通过实习,工人的这种风格和精神,值得我今后在工作中好好地学习,继承与发扬实习确实是一次经历<em class=\"similar\">,只有自己的亲身经历才能体会到其中的滋味</em><em class=\"similar\">。课本中学到的知识是最基本的</em>不管是现实的情况是什么,抓住最基本的就可以不变万变地应对。如今,许多学生在实习课堂上都觉得用不了课堂知识,出现了挫折,但我却觉得,如果没有书籍知识做铺垫,又怎能应对这瞬间万变的社会</p>";
        String[] ems = {"em", "<em class=\"similar\">", "</em>"};
        Document document = Jsoup.parse(reportHtml);
        Elements similars = document.select("em.similar");
        leftExcursion(similars, ems);
        similars = document.select("em.similar");
        System.out.println(666);
    }

    /**
     * 左偏移计算
     */
    public static void leftExcursion(Elements similars, String[] ems) {
        if (similars == null) {
            return;
        }
        for (Element e : similars) {
            String elementText = e.text();
            if (StringUtils.isBlank(elementText)) {
                continue;
            }
            Node preNode = e.previousSibling();
            if (preNode != null) {
                String preNodeText = preNode.toString();
                String preNodeName = preNode.nodeName();
                if (StringUtils.isBlank(preNodeText)) {
                    continue;
                }
                // 如果前一个节点不是相似句也不是文本则跳过，一般不会走到这里面
                if (!"#text".equals(preNodeName) && !preNodeName.equals(ems[0])) {
                    continue;
                }
                //当前节点的第一个字符，是结束符的时候，左偏移把句号给前面一句，本句去掉句号
                String firstChar = elementText.substring(0, 1);
                if (isFinalChar(firstChar)) {
                    preNode.remove();
                    int similarIndex = preNodeText.lastIndexOf(ems[2]);
                    if (similarIndex > -1) {
                        preNodeText = preNodeText.substring(0, similarIndex) + firstChar + ems[2];
                    } else {
                        preNodeText += firstChar;
                    }
                    e.before(preNodeText);
                    e.text(elementText.substring(1));
                    continue;
                }
                //前面一句是相似句，去掉标签先取到原文
                if (preNodeName.equals(ems[0])) {
                    preNodeText = preNodeText.replace(ems[1], "");
                    preNodeText = preNodeText.replace(ems[2], "");
                }
                if (preNodeText.length() == 0) {
                    continue;
                }
                //上一个兄弟节点的最后一个字符
                String preNodeLastChar = preNodeText.substring(preNodeText.length() - 1);
                //是否进行左偏移，非结束符就进行左偏移
                if (!isFinalChar(preNodeLastChar)) {
                    String preNodeTextEn = StringUtil.repalceAsEnFlag(preNodeText);
                    Integer index = null;
                    for (int i = preNodeTextEn.length() - 1; i >= 0; i--) {
                        char c = preNodeTextEn.charAt(i);
                        String f = c + "";
                        //前一句如果有结束符就执行下面的操作，找相关的截断位置
                        if (isFinalChar(f)) {
                            if (".".equals(f)) {
                                if (i > 0 && i < (preNodeTextEn.length() - 1)) {
                                    if (Character.isDigit(preNodeTextEn.charAt(i - 1)) && Character.isDigit(preNodeTextEn.charAt(i + 1))) {
                                        continue;
                                    }
                                }
                            }
                            if (";".equals(f)) {
                                if (i > 4) {
                                    if (preNodeText.charAt(i - 5) == 38) {
                                        continue;
                                    }
                                }
                            }
                            if (preNodeTextEn.length() - i + elementText.length() < 300) {
                                index = -1;
                            } else {
                                index = i;
                                break;
                            }
                        }
                    }
                    if (index == null) {
                        //没找到相关的分隔符，如果加上重复字数总数少于configInfo.getReduceRepeatWordCount()，则全部当成重复字符
                        int hntLength = preNodeTextEn.length();
                        if (hntLength + elementText.length() <= 300) {
                            index = -1;
                        } else {
                            int _temp = preNodeTextEn.lastIndexOf(",");
                            if (_temp > -1) {
                                //还需要多少个字符
                                int enableLength = 300 - elementText.length();
                                String beforeHntString = preNodeTextEn.substring(0, hntLength - enableLength);
                                String afterHntString = preNodeTextEn.substring(hntLength - enableLength, hntLength);
                                int beforeTemp = beforeHntString.lastIndexOf(",");
                                int afterTemp = afterHntString.indexOf(",");
                                if (afterTemp <= 20) {
                                    _temp = afterTemp + beforeHntString.length();
                                } else if (beforeHntString.length() - beforeTemp <= 20) {
                                    _temp = beforeTemp;
                                } else {
                                    _temp = enableLength;
                                }
                                index = _temp;
                            } else {
                                if (preNodeTextEn.length() < 50) {
                                    index = -1;
                                }
                            }
                        }
                    } else {
                        int e_temp = preNodeText.length() - index;
                        if (e_temp > 400) {
                            //找到太长
                            int _temp = preNodeTextEn.lastIndexOf(",");
                            if (_temp > -1 && _temp < e_temp) {
                                index = _temp;
                            }
                        }
                    }
                    if (index != null) {
                        String _a_t = preNodeText.substring(index + 1, preNodeText.length());
                        preNodeText = preNodeText.substring(0, index + 1);
                        if (StringUtils.isNotBlank(preNodeText) && preNodeName.equals(ems[0])) {
                            preNodeText = ems[1] + preNodeText + ems[2];
                        }
                        preNode.remove();
                        if (StringUtils.isNotBlank(preNodeText)) {
                            e.before(preNodeText);
                        }
                        e.prepend(_a_t);
                    }
                }
            }
        }
    }


    static String flag = ";.!?";

    /**
     * 判断是非结束字符, 句子是非结束了字符就偏移或补位
     * 正常情况，结束符返回true，非结束符返回false，
     */
    public static boolean isFinalChar(String word) {
        if (word == null) {
            return true;
        }
        if (StringUtils.isBlank(word)) {
            return false;
        }
        word = StringUtil.repalceAsEnFlag(word);
        return flag.contains(word);
    }
}
